#include <iostream>
#include <thread>

#include "ipc_server.h"

using namespace ipc;

// 收音机服务控制器
class RadioServiceController : public IServiceController, protected BundleHelper
{
public:
	static IServiceController* getInstance()
	{
		static IServiceController* instance = new RadioServiceController();
		return instance;
	}

	// 接收到客户端的异步数据
	void onPost(Bundle& data) override
	{	
		// 可以通过id -> int的映射得到 switch (int) {case ... }		
		std::cout << getId(data) << ": " << getInt32(data) << std::endl;
	}
	
	// 接收到客户端的同步数据，并返回处理结果
	const Bundle onSend(Bundle& data) override
	{
		std::string id = getId(data);
		// 可以通过id -> int的映射得到 switch (int) {case ... }
		return Bundle::getEmpty();
	}
	
	// 接收到客户端的注册id, 更新数据给客户端
	void handleUpdate(const void* connection, const std::string& id, int64_t observerId) override
	{
		// 可以通过id -> int的映射得到 switch (int) {case ... }
		// 最终 Server::update(connection, id, observerId, value);
	}
};


// 蓝牙服务控制器
class BtServiceController : public IServiceController, protected BundleHelper
{
public:
	static IServiceController* getInstance()
	{
		static IServiceController* instance = new BtServiceController();
		return instance;
	}

	// 接收到客户端的异步数据
	void onPost(Bundle& data) override
	{
		std::string id = getId(data);
		// 可以通过id -> int的映射得到 switch (int) {case ... }
		std::cout << id << ":" << getString(data) << std::endl;
		
		if (id == "Bt.dial")
		{
			// 模拟发送拨号的号码给客户端
			Server::getInstance()->updateString("Bt.number", std::string("返回客户端发送过来的数据:")+getString(data));
		}
	}
	
	// 接收到客户端的同步数据，并返回处理结果
	const Bundle onSend(Bundle& data) override
	{
		std::string id = getId(data);
		// 可以通过id -> int的映射得到 switch (int) {case ... }
		return Bundle::getEmpty();
	}
	
	// 接收到客户端的注册id, 更新数据给客户端
	void handleUpdate(const void* connection, const std::string& id, int64_t observerId) override
	{
		// 可以通过id -> int的映射得到 switch (int) {case ... }
		// 最终 Server::update(connection, id, observerId, value);
		
		if (id == "Bt.number")
		{
			// 模拟发送当前的号码10000给客户端
			Server::getInstance()->updateString(connection, id, observerId, "注册时为了双方数据同步的回调");
		}
		
	}
};


// 服务控制器的工厂
class ServiceControllerFactory : public IServiceControllerFactory
{	
public:
	ServiceControllerFactory()
	{
		mServiceNameMap["Radio"] 	= RadioServiceController::getInstance();
		mServiceNameMap["Bt"] 		= BtServiceController::getInstance();
	}

	IServiceController* getServiceController(const std::string& serviceName) override
	{
		return mServiceNameMap.find(serviceName)->second;
	}
	
private:
	std::map<std::string, IServiceController*> mServiceNameMap;
};


/**
用法:
1. 实现IServiceController，创建对应的对象
2. 实现IServiceControllerFactory, 根据serviceName返回IServiceController
3. 调用Server::setServiceControllerFactory
4. 调用一次或者多次Server::newService创建若干服务
*/
int main()
{	
	IpcKit::init();

// 3. 调用Server::setServiceControllerFactory
	Server::getInstance()->setServiceControllerFactory(new ServiceControllerFactory());
	
// 4. 调用一次或者多次Server::newService创建若干服务
	Server::getInstance()->newService("Radio");
	Server::getInstance()->newService("Bt");
	
	IpcKit::join();
}

